package com.rock.platform.dao;

import java.util.List;
import java.util.Map;

import com.rock.platform.dao.IGenericDao;
import com.rock.platform.entity.GridParamsEntity;
import com.rock.platform.entity.PageEntity;

/**
 * 封装DAO层常用的数据读取、保存操作
 * 
 * @param <T>
 *            数据对象类型
 * @param <ID>
 *            数据对象PK类型
 */
public interface IBaseDao extends IGenericDao
{
	/**
	 *  NativeQuery 执行
	 * @param id
	 * @param entityType
	 */
	public <T> void remove(Object id,Class<T> entityType);
	
	/**
	 * NativeQuery 执行
	 * @param ids
	 * @param entityType
	 */
	public <T>  void remove(Object[] ids,Class<T> entityType);
	
	/**
	 * 由实体拼装Sql,以主键为条件执行update语句
	 * @param entity
	 */
	public <T> void modify(T entity);
	
	/**
     * 执行sql语句，并返回一个对象,如select count(*) from tableName等 如果返回结果为空，返回null；如果有多条记录，返回异常
     * 
     * @param strSql
     * @return
     */
    public Object findSingleResult(String strSql);

    /**
     * 执行sql语句，并返回一个对象,如select count(*) from tableName等 如果返回结果为空，返回null；如果有多条记录，返回异常
     * 
     * @param strSql
     * @param params
     * @return
     */
    public Object findSingleResult(String strSql, Map<String, ? extends Object> params);
    
    /**
     * 执行sql语句，并返回一个对象,如select count(*) from tableName等 如果返回结果为空，返回null；如果有多条记录，返回异常
     * @param <T>
     * @param strSql
     * @param entityType
     * @return
     */
    public <T> T findSingleResult(String strSql, Class<T> entityType);
    
    /**
     * 执行sql语句，并返回一个对象,如select count(*) from tableName等 如果返回结果为空，返回null；如果有多条记录，返回异常
     * @param <T>
     * @param strSql
     * @param entityType
     * @param params
     * @return
     */
    public <T> T findSingleResult(String strSql, Class<T> entityType, Map<String, ? extends Object> params);

    /**
     * 执行任意sql语句，返回受影响的记录数
     * 
     * @param sql
     * @return
     */
    public int execute(String strSql);

    /**
     * 执行任意sql语句，返回受影响的记录数
     * 
     * @param strSql
     * @param params
     * @return
     */
    public int execute(String strSql, Map<String, ? extends Object> params);

    /**
     * 执行sql语句，并返回结果集List
     * 
     * @param <T>
     * @param strSql
     * @return
     */
    public <T> List<T> findByNativeSql(String strSql);

    /**
     * 执行sql语句，并返回结果集List
     * 
     * @param <T>
     * @param strSql
     * @param params
     * @return
     */
    public <T> List<T> findByNativeSql(String strSql, Map<String, ? extends Object> params);

    /**
     * 执行sql语句，并返回结果集List
     * 
     * @param <T>
     * @param strSql
     * @param entityType
     * @return
     */
    public <T> List<T> findByNativeSql(String strSql, Class<T> entityType);

    /**
     * 执行sql语句，并返回结果集List
     * 
     * @param <T>
     * @param strSql
     * @param entityType
     * @param params
     * @return
     */
    public <T> List<T> findByNativeSql(String strSql, Class<T> entityType,
            Map<String, ? extends Object> params);

    /**
     * 获取查询总纪录数
     * 
     * @param strSql
     *            sql语句
     * @return
     */
    public int getTotal(String strSql);

    /**
     * 获取查询总纪录数
     * 
     * @param strSql
     *            sql语句
     * @return
     */
    public int getTotal(String strSql, Map<String, ? extends Object> params);

    /**
     * 封装分页查询
     * 
     * @param strSql
     *            sql语句
     * @param start
     *            分页起始索引
     * @param limit
     *            分页limit限制
     * @param entityType
     * @return
     */
    public <T> PageEntity findPageEntity(String strSql, GridParamsEntity gridParams, Class<T> entityType);

    /**
     * 封装分页查询
     * 
     * @param strSql
     *            sql语句
     * @param start
     *            分页起始索引
     * @param limit
     *            分页limit限制
     * @param entityType
     * @param params
     * @return
     */
    public <T> PageEntity findPageEntity(String strSql, GridParamsEntity gridParams, Class<T> entityType,
            Map<String, Object> params);
}
